if (discreteGpuAvailable &&
this._source.app.state == Shell.AppState.STOPPED) {
- this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
- this._onDiscreteGpuMenuItem.connect('activate', () => {
+ const appPrefersNonDefaultGPU = appInfo.get_boolean('PrefersNonDefaultGPU');
+ const gpuPref = appPrefersNonDefaultGPU
+ ? Shell.AppLaunchGpu.DEFAULT
+ : Shell.AppLaunchGpu.DISCRETE;
+ this._onGpuMenuItem = this._appendMenuItem(appPrefersNonDefaultGPU
+ ? _('Launch using Integrated Graphics Card')
+ : _('Launch using Discrete Graphics Card'));
+ this._onGpuMenuItem.connect('activate', () => {
this._source.animateLaunch();
- this._source.app.launch(0, -1, true);
+ this._source.app.launch(0, -1, gpuPref);
this.emit('activate-window', null);
});
}
case SHELL_APP_STATE_STOPPED:
{
GError *error = NULL;
- if (!shell_app_launch (app, timestamp, workspace, FALSE, &error))
+ if (!shell_app_launch (app, timestamp, workspace, SHELL_APP_LAUNCH_GPU_APP_PREF, &error))
{
char *msg;
msg = g_strdup_printf (_("Failed to launch “%s”"), shell_app_get_name (app));
* instance (Firefox). There are a few less-sensical cases such
* as say Pidgin.
*/
- shell_app_launch (app, 0, workspace, FALSE, NULL);
+ shell_app_launch (app, 0, workspace, SHELL_APP_LAUNCH_GPU_APP_PREF, NULL);
}
/**
* shell_app_launch:
* @timestamp: Event timestamp, or 0 for current event timestamp
* @workspace: Start on this workspace, or -1 for default
- * @discrete_gpu: Whether to start on the discrete GPU
+ * @gpu_pref: the GPU to prefer launching on
* @error: A #GError
*/
gboolean
-shell_app_launch (ShellApp *app,
- guint timestamp,
- int workspace,
- gboolean discrete_gpu,
- GError **error)
+shell_app_launch (ShellApp *app,
+ guint timestamp,
+ int workspace,
+ ShellAppLaunchGpu gpu_pref,
+ GError **error)
{
ShellGlobal *global;
GAppLaunchContext *context;
gboolean ret;
GSpawnFlags flags;
+ gboolean discrete_gpu = FALSE;
if (app->info == NULL)
{
global = shell_global_get ();
context = shell_global_create_app_launch_context (global, timestamp, workspace);
+ if (gpu_pref == SHELL_APP_LAUNCH_GPU_APP_PREF)
+ discrete_gpu = g_desktop_app_info_get_boolean (app->info, "PrefersNonDefaultGPU");
+ else
+ discrete_gpu = (gpu_pref == SHELL_APP_LAUNCH_GPU_DISCRETE);
+
if (discrete_gpu)
apply_discrete_gpu_env (context, global);
SHELL_APP_STATE_RUNNING
} ShellAppState;
+typedef enum {
+ SHELL_APP_LAUNCH_GPU_APP_PREF = 0,
+ SHELL_APP_LAUNCH_GPU_DISCRETE,
+ SHELL_APP_LAUNCH_GPU_DEFAULT
+} ShellAppLaunchGpu;
+
const char *shell_app_get_id (ShellApp *app);
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
-gboolean shell_app_launch (ShellApp *app,
- guint timestamp,
- int workspace,
- gboolean discrete_gpu,
- GError **error);
+gboolean shell_app_launch (ShellApp *app,
+ guint timestamp,
+ int workspace,
+ ShellAppLaunchGpu gpu_pref,
+ GError **error);
void shell_app_launch_action (ShellApp *app,
const char *action_name,